//
// Created by suzhen on 16-11-14.
//

#include "OkRedis.h"
#include <OrionV2/Utils.h>

using namespace NoSQL;
USING_ORION_V2

OkRedis::OkRedis(const std::string &ip, int port)
        : okRedisCore_(OkRedisCore::createRedisCore(ip, port)) {
    okRedisCore_->retain();
}

OkRedis::~OkRedis() {
    okRedisCore_->release();
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::set(const std::string &key, const std::string &value) {
    return cmd2Redis<OkRedisBoolType>(Utils::sformat("SET %1% %2%", key.c_str(), value.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisStringType>
OkRedis::get(const std::string &key) {
    return cmd2Redis<OkRedisStringType>(Utils::sformat("GET %1%", key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::hset(const std::string &domain, const std::string &key, const std::string &value) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("HSET %1% %2% %3%", domain.c_str(), key.c_str(), value.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisStringType>
OkRedis::hget(const std::string &domain, const std::string &key) {
    return cmd2Redis<OkRedisStringType>(
            Utils::sformat("HGET %1% %2%", domain.c_str(), key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::setWithTTL(const std::string &key, const std::string &value, int ttlSeconds) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("SETEX %1% %2% %3%", key.c_str(),
                                value.c_str(),
                                ttlSeconds));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::expire(const std::string &key, int ttlSeconds) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("EXPIRE %1% %2%", key.c_str(), ttlSeconds));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::exists(const std::string &key) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("EXISTS %1%", key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::del(const std::string &key) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("DEL %1%", key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisBoolType>
OkRedis::hdel(const std::string &domain, const std::string &key) {
    return cmd2Redis<OkRedisBoolType>(
            Utils::sformat("HDEL %1% %2%", domain.c_str(), key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisMapType>
OkRedis::hgetall(const std::string &domain) {
    return cmd2Redis<OkRedisMapType>(
            Utils::sformat("HGETALL %1%", domain.c_str()));

}

OkRedis::OkRedisReplyContentFuture<OkRedisIntType>
OkRedis::incr(const std::string &key) {
    return cmd2Redis<OkRedisIntType>(Utils::sformat("INCR %1%", key.c_str()));
}

OkRedis::OkRedisReplyContentFuture<OkRedisIntType>
OkRedis::incrBy(const std::string &key, int num) {
    return cmd2Redis<OkRedisIntType>(Utils::sformat("INCRBY %1% %2%", key.c_str(), num));
}

Future<bool> OkRedis::start() {
    return okRedisCore_->start();
}

Future<bool> OkRedis::shutdown() {
    return okRedisCore_->shutdown();
}
